package cn.flying.cloud.flow.core.listener.event.callback;

import javax.annotation.Resource;

import java.util.Set;

import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.event.impl.FlowableActivityEventImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import cn.flying.cloud.flow.bo.FwProcInstBo;
import cn.flying.cloud.flow.core.constants.FlowableConstant;
import cn.flying.cloud.flow.core.listener.handler.UserHandler;
import cn.flying.cloud.flow.service.FwProcInstService;

/**
 * 多实例活动开始监听
 *
 * @author: admin
 * @date: 2024年09月23日 10:05
 * @version: 1.0
 */
@Component
public class MultiInstanceActivityStartedListenerCallback implements EventListenerCallback {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Resource
    private FwProcInstService procInstService;
    @Resource
    private UserHandler userHandler;

    /**
     * @param event
     */
    @Override
    public void execute(FlowableEvent event) {
        logger.info("==========多实例活动开始监听器回调处理---start===========");
        // FlowableEngineEventImpl
        logger.info("监听事件类型：【{}】", event.getType().name());
        FlowableActivityEventImpl entityEvent = (FlowableActivityEventImpl) event;

        FwProcInstBo inst = new FwProcInstBo();
        inst.setProcInstId(entityEvent.getProcessInstanceId());
        inst = procInstService.getOneObj(inst);
        inst.setNodeId(entityEvent.getActivityId());
        inst.setNodeName(entityEvent.getActivityName());
        procInstService.updateObj(inst);

        if (!"userTask".equals(entityEvent.getActivityType())) {
            logger.info("==========多实例活动开始监听器回调处理---end===========");
            return;
        }

        Set<String> assignees = userHandler.getAssignees(entityEvent.getProcessDefinitionId(), entityEvent.getActivityId());

//        String behaviorClass = entityEvent.getBehaviorClass();
//        if (behaviorClass.equals(ParallelMultiInstanceBehavior.class.getName())) {
//            // 并行
//            logger.info("并行");
//        } else {
//            // 串行
//            logger.info("串行");
//        }

        DelegateExecution execution = entityEvent.getExecution();
        execution.setVariable(FlowableConstant.ASSIGNEES, assignees);
        logger.info("流程实例：【{}】任务；[{}，{}]分配代理人：【{}】", entityEvent.getProcessInstanceId(), entityEvent.getActivityName(), entityEvent.getActivityId(), assignees);

        // 会签：
        // nrOfInstances：会签中总共的实例数量
        // nrOfCompletedInstances：已经完成的实例数量
        // nrOfActiviteInstances：当前活动的实例数量，即还未完成的实例数量
        // ${nrOfInstances == nrOfCompletedInstances}：表示所有人都需要完成任务会签才结束
        // ${nrOfCompletedInstances == 1}：表示一个人完成任务，会签结束

        // 或签的实现方式与会签相似，只是完成条件的设置不同，或签就是三个人中只要一个人完成就算完成了，因此在使用的时候，完成条件可以写：${nrOfCompletedInstances>=1} 即可。

//        FlowableMultiInstanceActivityEvent multiInstanceEvent = (FlowableMultiInstanceActivityEvent) event;
//        // 获取当前的执行实例
//        ExecutionEntity execution = (ExecutionEntity) multiInstanceEvent.getExecution();
//        // 为变量赋值
//        execution.setVariable("myVariable", "theValue");
//        // 可以在这里添加更多的业务逻辑
        logger.info("==========多实例活动开始监听器回调处理---end===========");
    }
}
